package com.woniuxy.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniuxy.entity.AllShop;
import com.woniuxy.entity.DTO.ShopQueryDTO;
import com.woniuxy.mapper.ShopMapper;
import com.woniuxy.service.IShopService;
import com.woniuxy.util.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Author pml
 * @Date 2025/7/16 10:03
 * @Description 商品服务实现类
 * 实现商品相关的业务逻辑，使用MyBatis-Plus进行数据库操作
 */
@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, AllShop> implements IShopService {

    @Autowired
    private ShopMapper shopMapper;

    /**
     * 分页多条件查询商品列表
     * 使用MyBatis-Plus的分页插件和条件构造器实现复杂查询
     * 统一返回PageResult格式，包含当前页数据、总记录数、总页数等信息
     */
    @Override
    public PageResult<AllShop> getShopList(ShopQueryDTO queryDTO) {
        // 创建分页对象，设置当前页码和每页数量
        // 页码默认从1开始，与前端分页组件保持一致
        Page<AllShop> page = new Page<>(queryDTO.getPageNum(), queryDTO.getPageSize());

        // 创建查询条件构造器
        QueryWrapper<AllShop> queryWrapper = new QueryWrapper<>();

        // 商品标题模糊查询
        // 使用like而非eq可以提高搜索体验，允许部分匹配
        if (queryDTO.getTitle() != null && !queryDTO.getTitle().isEmpty()) {
            queryWrapper.like("title", queryDTO.getTitle());
        }

        // 价格范围查询
        // 同时支持最低和最高价格筛选，满足用户不同价格区间的查询需求
        if (queryDTO.getMinPrice() != null) {
            queryWrapper.ge("price", queryDTO.getMinPrice());
        }
        if (queryDTO.getMaxPrice() != null) {
            queryWrapper.le("price", queryDTO.getMaxPrice());
        }

        // 标签类型精确查询
        // 类型ID是精确匹配，用于按分类筛选商品
        if (queryDTO.getTypeId() != null) {
            queryWrapper.eq("type_id", queryDTO.getTypeId());
        }

        // 状态精确查询
        // 1-上架 2-下架，用于筛选不同状态的商品
        if (queryDTO.getStatus() != null) {
            queryWrapper.eq("status", queryDTO.getStatus());
        }

        // 发布时间范围查询
        // 支持按时间段筛选商品，满足统计和历史数据查询需求
        if (queryDTO.getCreateTimeStart() != null) {
            queryWrapper.ge("create_time", queryDTO.getCreateTimeStart());
        }
        if (queryDTO.getCreateTimeEnd() != null) {
            queryWrapper.le("create_time", queryDTO.getCreateTimeEnd());
        }

        // 按创建时间降序排序
        // 最新发布的商品排在前面，符合用户浏览习惯
        queryWrapper.orderByDesc("create_time");

        // 执行分页查询
        // 使用MyBatis-Plus分页插件自动计算总记录数和总页数
        IPage<AllShop> shopPage = shopMapper.selectPage(page, queryWrapper);

        // 封装分页结果
        // 使用统一的PageResult格式返回，便于前端统一处理
        PageResult<AllShop> pageResult = new PageResult<>();
        pageResult.setPageNum(queryDTO.getPageNum());
        pageResult.setPageSize(queryDTO.getPageSize());
        pageResult.setTotal(shopPage.getTotal());
        pageResult.setPages((int) shopPage.getPages());
        pageResult.setList(shopPage.getRecords());

        return pageResult;
    }

    // 新增：统计上架商品总数
    @Override
    public long countOnlineShops() {
        QueryWrapper<AllShop> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("status", 1); // 1表示上架状态
        return shopMapper.selectCount(queryWrapper);
    }
}